# 数据预处理

# 处理 csv 文件 内置
import csv 
# python 内置的 正则表达
import re
# 导入数据库操作的代码
import sys
sys.path.append("../")
from dataStorage.data_import import data_import 

# 薪资
def monthlyPay_pre(str):
    # 如果内容是"monthlyPay"就返回"monthlyPay"
    if str == "monthlyPay":
        return "monthlyPay"
    # 定义一个列表用于存储得到的数字
    monthly_pay = []
    # 定义一个筛选数字的正则表达式
    num = re.compile(r'(\d+(\.\d+)?)')
    thousand = re.compile('(\d+(\.\d+)?千)')
    tenThousand = re.compile('(\d+(\.\d+)?万)')
    # 调用thousand正则表达式提取“千”前面的数字+千
    # print(thousand.findall(str))
    a = [num.findall(i[0])[0] for i in thousand.findall(str)]
    # 若字符串为空则将返回 a=[](空列表)，若字符串不为空则将得到的数字除以10
    try:
        a = [float(i[0])/10 for i in a]
    except Exception as e:
        print(e)
        a = []
    # 调用tenThousand正则表达式提取“万”前面的数字+万
    b = [num.findall(i[0])[0] for i in tenThousand.findall(str)]
    # 若字符串为空则将返回 b=[](空列表)
    try:
        b = [float(i[0]) for i in b]
    except Exception as e:
        print(e)
        b = []
    # 拼接列表
    monthly_pay = a + b
    # 判断monthly_pay列表的长度，若长度为0则返回0，若长度为1怎返回列表的第一个元素，若长度为2则返回两个元素的平均值
    if len(monthly_pay) == 0:
        return 0
    elif len(monthly_pay) == 1:
        return monthly_pay[0]
    elif len(monthly_pay) == 2:
        return (monthly_pay[0]/2 + monthly_pay[1]/2)

# 工作经验
def workExperience_pre(str):
    # 如果内容是"workExperience"就返回"workExperience"
    if str == "workExperience":
        return "minWorkExperience", "maxWorkExperience"
    # 定义一个筛选数字的正则表达式
    num = re.compile(r'\d+')
    # 使用num正则表达式获取数字列表
    work_experience = num.findall(str)
    # 判断work_experience列表的长度
    if len(work_experience) == 0:
        return 0, 0
    elif len(work_experience) == 1:
        return int(work_experience[0]), int(work_experience[0])
    elif len(work_experience) ==2:
        return int(work_experience[0]), int(work_experience[1])


def data_pre(path):
    # 定义一个列表用于返回处理后的的数据
    datas = []
    # 打开csv文件
    with open(path, encoding='utf-8') as f:
        # 遍历每一行数据
        for row in csv.reader(f, skipinitialspace=True):
            # 定义一个列表用于存储处理后的每一行数据
            new_row=[]
            # address仅仅保留市级
            # 以“-”为分隔符取出索引为0的字符串
            # 实例“北京-朝阳”返回北京
            row[0] = row[0].split("-", 1)[0]
            # 将薪资取平均值，面谈的取0
            row[5] = str(monthlyPay_pre(row[5].split()[0]))
            # 提取最大工作经验、最小工作经验
            a = workExperience_pre(row[8].split()[0])
            # 将最小工作经验放入所以为8的位置
            row[8] = str(a[0])
            # 使用列表append方法将最大工作经验a[1]添加到row列表的最后
            row.append(str(a[1]))
            # 遍历row取出每个元素并去除空白并添加到new_row列表中
            for i in range(len(row)):
                # 如果元素为空字符串则添加空字符串即可
                try:
                    new_row.append(row[i].split()[0])
                except Exception as e:
                    new_row.append("") 
            datas.append(new_row)
    return datas

# 写入 csv
def write_csv(path, data):
    with open(path,'w',encoding='utf-8',newline='') as f:
        write = csv.writer(f)
        # 写入表头
        write.writerow(data[0])
        # 写入数据
        write.writerows(data[1:])

if __name__ == "__main__":
    data = data_pre(f"../reptile/{sys.argv[2]}.csv")
    write_csv(f"./{sys.argv[2]}_handle.csv", data)

    # 数据库操作
    # 连接数据
    db = data_import()
    # 将csv文件写入数据库
    db.write_to_db(f"./{sys.argv[2]}_handle.csv", sys.argv[1], sys.argv[2]) 
    # 关闭数据库
    db.close()